package com.atguigu.auth.controller;

import com.atguigu.auth.service.OaProcessTemplateService;
import com.atguigu.common.Result;
import com.atguigu.model.process.ProcessTemplate;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * ClassName: ProcessTemplateController
 * Package: com.atguigu.auth.controller
 * Description:
 *
 * @Author 蹇泽阳
 * @Create 2023/11/21 10:56
 * @Version 1.0
 */
@Api(value = "审批模板管理", tags = "审批模板管理")
@RestController
@RequestMapping(value = "/admin/process/processTemplate")
public class ProcessTemplateController {
  
  @Autowired
  private OaProcessTemplateService processTemplateService;
  
  //@PreAuthorize("hasAuthority('bnt.processTemplate.list')")
  
  @PreAuthorize("hasAuthority('bnt.processType.list')")
  @ApiOperation(value = "获取分页列表")
  @GetMapping("{page}/{limit}")
  public Result index(@PathVariable Long page,
                      @PathVariable Long limit) {
    Page<ProcessTemplate> pageParam = new Page<>(page, limit);
    IPage<ProcessTemplate> pageModel = processTemplateService.selectPage(pageParam);
    return Result.ok(pageModel);
  }
  
  //@PreAuthorize("hasAuthority('bnt.processTemplate.list')")
  @ApiOperation(value = "获取")
  @GetMapping("get/{id}")
  public Result get(@PathVariable Long id) {
    ProcessTemplate processTemplate = processTemplateService.getById(id);
    return Result.ok(processTemplate);
  }
  
  //@PreAuthorize("hasAuthority('bnt.processTemplate.templateSet')")
  @ApiOperation(value = "新增")
  @PostMapping("save")
  public Result save(@RequestBody ProcessTemplate processTemplate) {
    processTemplateService.save(processTemplate);
    return Result.ok();
  }
  
  //@PreAuthorize("hasAuthority('bnt.processTemplate.templateSet')")
  @ApiOperation(value = "修改")
  @PutMapping("update")
  public Result updateById(@RequestBody ProcessTemplate processTemplate) {
    processTemplateService.updateById(processTemplate);
    return Result.ok();
  }
  
  //@PreAuthorize("hasAuthority('bnt.processTemplate.remove')")
  @ApiOperation(value = "删除")
  @DeleteMapping("remove/{id}")
  public Result remove(@PathVariable Long id) {
    processTemplateService.removeById(id);
    return Result.ok();
  }
  
  @PreAuthorize("hasAuthority('bnt.processTemplate.templateSet')")
  @ApiOperation(value = "上传流程定义")
  @PostMapping("/uploadProcessDefinition")
  public Result uploadProcessDefinition(MultipartFile file) throws FileNotFoundException {
    String path = new File(ResourceUtils.getURL("classpath:").getPath()).getAbsolutePath();
    
    String fileName = file.getOriginalFilename();
    // 上传目录，新建一个processes文件夹
    File tempFile = new File(path + "/processes/");
    // 判断目录是否存在，不存在则创建
    if (!tempFile.exists()) {
      tempFile.mkdirs();// 创建目录
    }
    // 创建空文件用于写入文件
    File imageFile = new File(path + "/processes/" + fileName);
    // 保存文件流到本地
    try {
      file.transferTo(imageFile);
    } catch (IOException e) {
      e.printStackTrace();
      return Result.fail("上传失败");
    }
    
    Map<String, Object> map = new HashMap<>();
    //根据上传地址后续部署流程定义，文件名称为流程定义的默认key
    map.put("processDefinitionPath", "processes/" + fileName);
    map.put("processDefinitionKey", fileName.substring(0, fileName.indexOf(".")));
    return Result.ok(map);
  }
  
  @PreAuthorize("hasAuthority('bnt.processTemplate.publish')")
  @ApiOperation(value = "发布")
  @GetMapping("/publish/{id}")
  public Result publish(@PathVariable String id) {
    
    processTemplateService.publish(Long.valueOf(id));
    return Result.ok();
  }
  
  
  // 用来测试的方法
  public static void main(String[] args) throws FileNotFoundException {
    String path = new File(ResourceUtils.getURL("classpath:").getPath()).getAbsolutePath();
    System.out.println(path);
  }
}
